package com.irssproject.app.web.interceptor;

import java.util.Calendar;
import java.util.Map;
import java.util.logging.Logger;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.SessionAware;

import com.irssproject.app.bean.lectorRSS.Lectura;
import com.irssproject.app.service.lectorRSS.iface.SubscripcioService;
import com.irssproject.app.utils.Constants;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

@SuppressWarnings("serial")
public class LecturaInterceptor extends AbstractInterceptor implements ServletRequestAware, SessionAware {

	private Map<String, Object> session;

	private HttpServletRequest request;
	
	SubscripcioService subscripcioService;
	
	Logger logger = Logger.getLogger(LecturaInterceptor.class.getName());
	
	public LecturaInterceptor(SubscripcioService subscripcioService)
	{
		this.subscripcioService = subscripcioService;
	}
	
	public void setSession(Map<String, Object> arg0) {
		session = arg0;
	}
	
	public Map<String,Object> getSession(){
		return session;
	}

	public void setServletRequest(HttpServletRequest arg0) {
		request = arg0;
	}
	
	public String intercept(ActionInvocation actionInvocation) throws Exception {

		request = ServletActionContext.getRequest();
		String idLecturaActual = (String) request.getParameter("idLectura");

		session = ActionContext.getContext().getSession();

		if (session.get(Constants.SESSIO_USUARI_AUTENTICAT)!=null)
		{
			String idLecturaAnterior = (String)session.get(Constants.LECTURA_ANTERIOR);
			long temps = 0;
						
			if (session.get(Constants.COMPTADOR_TEMPS)!=null)
			{
				temps = Calendar.getInstance().getTimeInMillis() - (Long)session.get(Constants.COMPTADOR_TEMPS);
			}

			if (idLecturaAnterior == null)
			{
				//El primer acces a un feed
				
				//Si s'ha clicat sobre un item... i a mes el link es null
				//Vol dir que es el primer item sobre el que cliquem en tota la sessio (no el primer item d'aquest feed, sino de tota la sessio!!)
				if (idLecturaActual!=null)
				{	
					//A sessio no hi ha res
					//Ho posem:
					session.put(Constants.LECTURA_ANTERIOR, idLecturaActual);
					//I comencem a comptar el temps
					session.put(Constants.COMPTADOR_TEMPS, Calendar.getInstance().getTimeInMillis());
				}

			}
			//Si no es el primer acces a un feed ni a un item...
			else
			{
				boolean valoracio = (Boolean)session.get(Constants.MAGRADA);

		
				Long idLectura = new Long(idLecturaAnterior);
				Lectura lectura = subscripcioService.getLecturaById(idLectura);
				lectura.setTemps(((float)temps)/1000);
				subscripcioService.definirRellevanciaDeLectura(lectura);
				
				logger.info("La lectura es "+lectura.getItem().getTitol()+"\n------> La valoracio de la lectura (true o false): "+valoracio+"\n------> El temps emprat en llegir la lectura "+temps);
	
				//Si ens arriba un espai en blanc
				//Vol dir que hem clicat sobre un feed i per tant haurem d'anotar el temps que s'ha trigat en llegir el ultim item que estavem llegint i el link anterior
				//Despres d'anotar el temps i el link, inicialitzem de nou el temps i el item
				if (idLecturaActual == null)
				{
					session.put(Constants.LECTURA_ANTERIOR, null);

				}
				//Sino ens arriba un espai en blanc, vol dir que ens arriba un link valid
				//llavors el que haurem de fer es anotar el temps que s'ha trigat en llegir el ultim item que estavem llegint i el link anterior (de la sessio)
				//I a mes guardar el itemLink que ens arriba a la sessio i fer un checkpoint del comptador a la sessio
				else
				{			
					session.put(Constants.LECTURA_ANTERIOR, idLecturaActual);
				}
				session.put(Constants.COMPTADOR_TEMPS, Calendar.getInstance().getTimeInMillis());
					
			}

		}

		return actionInvocation.invoke();
	}




}
